(function($) {
	"use strict";

	var _sUa = navigator.userAgent,
	_htOs = {
		iOS : /iPhone|iPad/,
		Android : /Android/,
		WindowPhone : /Windows Phone/
	},
	_htDevice = {
		iphone : /iPhone/,
		ipad : /iPad/,
		galaxyS : /SHW-M110/,
		galaxyS2 : /SHW-M250|GT-I9100|SHV-E110/,	// include LTE
		galaxyS3 : /SHV-E210|SHW-M440/,
		galaxyNote : /SHV-E160/,
		galaxyNote2 : /SHV-E250/,
		galaxyNexus : /Galaxy Nexus/,
		optimusLte : /LG-LU6200/,
		optimusLte2 : /LG-F160/,
		optimusVu : /LG-F100/
	},
	_htMade = {
		samsung : /GT-|SCH-|SHV-|SHW-|SPH-|SWT-|SGH-|EK-/,
		lg : /LG-/,
		pantech : /IM-/
	};

	function _eachHash(ht) {
		for(var key in ht) {
    		if(ht[key].test(_sUa)) {
    			return key;
    		}
    	}
    	return "";
	}

	/*
	 * detect 
	 * - device, os, osVersion
	 * - useable Fixed, Css3d
	 * - hasBug 
	 */
	$.detector = {
		cssPrefix : function() {
			var prefix = "", style = document.body.style;
	        if(style.MozTransition !== undefined) {
	            prefix = "Moz";
	        } else if(style.webkitTransition !== undefined) {
	            prefix = "webkit";
	        } else if(style.OTransition !== undefined) {
	            prefix = "O";
	        }else if(style.msTransition !== undefined) {
	            prefix = "ms";
	        }
	        return prefix;
	    },
	    device : function() {
	    	return _eachHash(_htDevice);
	    },
	    os : function() {
	    	return _eachHash(_htOs);
	    },
	    osVersion : function() {
	    	var version = "", a;
	    	switch(this.os()) {
				case "iOS" : a = _sUa.match(/OS\s([\d|\_]+\s)/i);
		            break;
		        case "Android" : a = _sUa.match(/Android\s([^\;]*)/i);
		            break;
		        case "WindowPhone" : a = _sUa.match(/Windows Phone\s([^\;]*)/i);
		            break;
			}
			if(a != null && a.length > 1) {
				version = a[1].replace(/\_/g,'.');
			}
			return version;
	    },
		made : function() {
			return _eachHash(_htMade);
		},
		useableCss3d : function() {
			var bUseable = true;
            if(_htOs["Android"]) {
            	// white list => "Chrome for android" or android version 4.0.3 under
            	if(this.osVersion() < "4.0.3") {
            		if(/CrMo|Chrome/.test(_sUa) || /SHW-|SHV-|GT-|SCH-|SGH-|SPH-|EK-|LG-F160|LG-F100/.test(_sUa)) {
            			bUseable = true;
            		} else {
            			bUseable = false;
            		}
            	}
            }
            return bUseable;
        },
        useableFixed : function() {
			var os = this.os(),
				version = parseInt(this.osVersion(),10);
			if(/CrMo|Chrome/.test(_sUa) ||
				(os == "Android" && version >= 3) ||
				(os == "iOS" && version >= 5) ||
				os == "WindowPhone") {
                return true;
            }
            return false;
        },

        /**
         * Android 에서 translate을 변경하였을 경우, 롱탭/하이라이트, 컨텐츠의 위치가 갱신되지 않는 버그
         */
        existOffsetBug : function() {
			if(!/CrMo|Chrome/.test(_sUa) && 
				(this.os() == "Android" && this.osVersion() < "4.1")) {
                return false;
            } else {
            	return true;
            }
        }, 

        /**
         * Android에서는 z-Index 상 맨 앞에 있는 레이어에서 발생한 이벤트가 투과되어 뒤에 존재하는 레이어에 이벤트가 발생하는 문제가 있다.
         */
        existPassEventBug : function() {
			if(!/CrMo|Chrome/.test(_sUa) && 
				(this.os() == "Android" && this.osVersion() < "4.1")) {
                return false;
            } else {
            	return true;
            }
        },

        /**
         * 클릭영역 누른 상태에서, 터치로 이동후 버튼을 놓았을시, 초기에 선택한 위치에 clickable 엘리먼트가 존재할 경우, click 되는 문제가 있다
         */
        existClickBug : function(){
			var os = this.os();
			if(/iOS|WindowPhone/.test(os)) {
                return true;
            } else {
            	return false;
            }
        }
	};
})(window.jQuery || window);